package com.chain.qs.modules.sys.web;

import com.chain.qs.common.config.Global;
import com.chain.qs.common.utils.StringUtils;
import com.chain.qs.common.web.BaseController;
import com.chain.qs.modules.sys.entity.Office;
import com.chain.qs.modules.sys.entity.User;
import com.chain.qs.modules.sys.service.OfficeService;
import com.chain.qs.modules.sys.utils.DictUtils;
import com.chain.qs.modules.sys.utils.TreeUtils;
import com.chain.qs.modules.sys.utils.UserUtils;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 机构Controller
 *
 * @author someone
 * @version 2013-5-15
 */
@Controller
@RequestMapping(value = "${adminPath}/sys/office")
public class OfficeController extends BaseController {

    @Resource
    private OfficeService officeService;

    @ModelAttribute("office")
    public Office get(@RequestParam(required = false) String id) {
        if (StringUtils.isNotBlank(id)) {
            return officeService.get(id);
        } else {
            return new Office();
        }
    }

    @RequiresPermissions("sys:office:view")
    @RequestMapping(value = {""})
    public String index() {
        return "modules/sys/officeIndex";
    }

    @RequiresPermissions("sys:office:view")
    @RequestMapping(value = {"list"})
    @ResponseBody
    public Object list(Office office) {
        HashMap<String, Object> hm = new HashMap<>();
        hm.put("list", officeService.findList(office));
        hm.put("office", office);
        return hm;
    }

    @RequiresPermissions("sys:office:view")
    @RequestMapping(value = "form")
    public String form(Office office, Model model) {
        User user = UserUtils.getUser();
        if (office.getParent() == null || office.getParent().getId() == null) {
            office.setParent(user.getOffice());
        }
        office.setParent(officeService.get(office.getParent().getId()));
        if (office.getArea() == null) {
            office.setArea(user.getOffice().getArea());
        }
        // 自动获取排序号
        if (StringUtils.isBlank(office.getId()) && office.getParent() != null) {
            int size = 0;
            List<Office> list = officeService.findAll();
            for (Office e : list) {
                if (e.getParent() != null && e.getParent().getId() != null
                        && e.getParent().getId().equals(office.getParent().getId())) {
                    size++;
                }
            }
            office.setCode(office.getParent().getCode() + StringUtils.leftPad(String.valueOf(size > 0 ? size + 1 : 1), 3, "0"));
        }
        model.addAttribute("office", office);
        return "modules/sys/officeForm";
    }

    @RequiresPermissions("sys:office:edit")
    @RequestMapping(value = "save")
    public String save(Office office, Model model, RedirectAttributes redirectAttributes) {
        if (Global.isDemoMode()) {
            addMessage(redirectAttributes, "演示模式，不允许操作！");
            return "redirect:" + adminPath + "/sys/office/";
        }
        if (!beanValidator(model, office)) {
            return form(office, model);
        }
        officeService.save(office);

        if (office.getChildDeptList() != null) {
            Office childOffice;
            for (String id : office.getChildDeptList()) {
                childOffice = new Office();
                childOffice.setName(DictUtils.getDictLabel(id, "sys_office_common", "未知"));
                childOffice.setParent(office);
                childOffice.setArea(office.getArea());
                childOffice.setType("2");
                childOffice.setGrade(String.valueOf(Integer.valueOf(office.getGrade()) + 1));
                childOffice.setUseable(Global.YES);
                officeService.save(childOffice);
            }
        }

        addMessage(redirectAttributes, "保存机构'" + office.getName() + "'成功");
        String id = "0".equals(office.getParentId()) ? "" : office.getParentId();
        return "redirect:" + adminPath + "/sys/office?id=" + id + "&parentIds=" + office.getParentIds();
    }

    @RequiresPermissions("sys:office:edit")
    @RequestMapping(value = "delete")
    public String delete(Office office, RedirectAttributes redirectAttributes, HttpServletResponse response) {
        if (Global.isDemoMode()) {
            return "演示模式，不允许操作！";
        }
//		if (Office.isRoot(id)){
//			addMessage(redirectAttributes, "删除机构失败, 不允许删除顶级机构或编号空");
//		}else{
        officeService.delete(office);
//		}
        return renderString(response,"ok");
    }

    /**
     * 获取机构JSON数据。
     *
     * @param extId 排除的ID
     * @param type  类型（1：公司；2：部门/小组/其它：3：用户）
     * @param grade 显示级别
     * @return 返回List
     */
//	@RequiresPermissions("user")
    @ResponseBody
    @RequestMapping(value = "treeData")
    public List<Map<String, Object>> treeData(@RequestParam(required = false) String extId, @RequestParam(required = false) String type,
                                              @RequestParam(required = false) Long grade, @RequestParam(required = false) Boolean isAll) {
        List<Map<String, Object>> mapList = Lists.newArrayList();
        List<Office> list = officeService.findList(isAll);
        for (Office e : list) {
            if ((StringUtils.isBlank(extId) || (!extId.equals(e.getId()) && !e.getParentIds().contains("," + extId + ",")))
                    && (type == null || (!type.equals("1") || type.equals(e.getType())))
                    && (grade == null || (Integer.parseInt(e.getGrade()) <= grade.intValue()))
                    && Global.YES.equals(e.getUseable())) {
                mapList.add(mapInit(e, type));
            }
        }
        return TreeUtils.getFormatting(mapList, "0");//查询父节点值为"0" 向下的全部节点
//		return TreeUtils.getFormatting(mapList,"0",1);//查询父节点值为"0" 向下2层节点
//		return mapList;
    }

    @ResponseBody
    @RequestMapping(value = "treeDataThree")
    public List<Map<String, Object>> treeDataThree(@RequestParam(required = false) String extId, @RequestParam(required = false) String type,
                                                   @RequestParam(required = false) Long grade, @RequestParam(required = false) Boolean isAll) {
        List<Map<String, Object>> mapList = Lists.newArrayList();
        List<Office> list = officeService.findList(isAll);
        for (Office e : list) {
            if ((StringUtils.isBlank(extId) || (!extId.equals(e.getId()) && !e.getParentIds().contains("," + extId + ",")))
                    && (type == null || (!type.equals("1") || type.equals(e.getType())))
                    && (grade == null || (Integer.parseInt(e.getGrade()) <= grade.intValue()))
                    ) {
                mapList.add(mapInit(e, type));
            }
        }
        return TreeUtils.getFormatting(mapList, UserUtils.getUser().getOffice().getParent().getId());//查询父节点值为"0" 向下的全部节点
    }

    private Map<String, Object> mapInit(Office e, String type) {
        Map<String, Object> map = Maps.newHashMap();
        map.put("id", e.getId());
        map.put("pId", e.getParentId());
        map.put("pIds", e.getParentIds());
        map.put("name", e.getName());
        map.put("text", e.getName());
        map.put("grade",e.getGrade());
        if (type != null && "3".equals(type)) {
            map.put("isParent", true);
        }
        return map;
    }
}
